package cn.gy.gift.service.impl;

import cn.gy.gift.client.LoginUserClient;
import cn.gy.gift.domain.LoginUser;
import cn.gy.gift.domain.User;
import cn.gy.gift.enums.SystemErrorCode;
import cn.gy.gift.exception.BusinessException;
import cn.gy.gift.mapper.UserMapper;
import cn.gy.gift.service.IUserService;
import cn.gy.gift.util.AjaxResult;
import cn.gy.gift.util.StrUtils;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.Map;

/**
 * <p>
 * 会员登录账号 服务实现类
 * </p>
 *
 * @author gy
 * @since 2024-07-20
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private LoginUserClient loginUserClient;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public AjaxResult register(Map<String, String> params) {
        AjaxResult ajaxResult = AjaxResult.me();

        String mobile = params.get("mobile"); //手机号
        String imageCode = params.get("imageCode"); //图形验证码
        String smsCode = params.get("smsCode");  //手机验证码
        String password = params.get("password");  //密码
        String regChannel = params.get("regChannel");

        //String regChannel = params.get("regChannel");
        //1.前端传入参数的非空判断
        if (
                StringUtils.isBlank(mobile)
                        || StringUtils.isBlank(imageCode)
                        || StringUtils.isBlank(password)
                        || StringUtils.isBlank(smsCode)
        ){
            return ajaxResult.setSuccess(false).setMessage("输入参数有误，请检查后重试！");
        }
        //此时已经通过图形验证码获取到了手机验证码，因此不需要在对图形验证码进行验证

        //2. 判断手机号是否已经注册
        if (userMapper.getByPhone(mobile) != null){
            return ajaxResult.setSuccess(false).setMessage("该账号已注册！");
        }
        //3.对redis中的手机验证码进行校验
        Map<String,Object> mobileMap = (Map<String,Object>)redisTemplate.opsForHash().entries("reg:" + mobile);
        if (mobileMap.isEmpty()){
            //redis中的手机验证码已经过期
            return ajaxResult.setSuccess(false).setMessage("手机验证码已过期！");
        }

        //验证码获取成功，但是验证码错误
        Object redisCode = mobileMap.get("smsCode");
        if ( !StringUtils.equals(smsCode,redisCode.toString()) ){
            return ajaxResult.setSuccess(false).setMessage("手机验证码错误！");
        }

        //4. 参数已全部校验完成，将数据添加到数据库中
        //   创建user对象添加到数据库，并对t_logininfo进行数据同步
        //4.1  创建User对象
        User  user = createUser(mobile,password);
        //优化后 直接调用insertOne
        insert(user);
        return ajaxResult;
    }

    @Override
    @Transactional //增删改都需要事务
    public boolean insert(User user) {
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        //1 需要盐值 salt  传入的参数是盐值的长度  将盐值导入到user数据库中
        String salt = StrUtils.getComplexRandomString(32);
        user.setSalt(salt);
        //2 密码不能为直接密码 应该进行加密
        String md5Pwd = DigestUtils.md5DigestAsHex( (user.getPassword() + salt).getBytes() );
        user.setPassword(md5Pwd);
        //3 用户状态  手机号注册直接激活 邮箱注册不能直接激活
        if(user.getPhone()!=null){
            user.setBitState(1l);
        }
        //4 同步到Logininfo

        //组装登录信息对象-->远程调用
        LoginUser loginUser = new LoginUser();
        //将前台用户的手机号当做用户名传入登录信息表
        loginUser.setUsername(user.getPhone());
        loginUser.setPassword(user.getPassword());
        loginUser.setEmail(user.getEmail());
        loginUser.setTel(user.getPhone());
        loginUser.setType(LoginUser.USER_WEB);
        AjaxResult ajaxResult = loginUserClient.addOrUpdate(loginUser);
        if(!ajaxResult.getSuccess()){
            throw new BusinessException(SystemErrorCode.RESPONSE_CODE_400500);
        }
        //获取远程数据
        Long loginId =Long.valueOf(ajaxResult.getResultObj().toString());
        //获取Logininfo的id
        user.setLoginId(loginId);
        userMapper.insert(user);
        return true;
    }

    public User createUser(String mobile, String password) {
        User user = new User();
        //将手机号设为用户名
        user.setPhone(mobile);
        user.setPassword(password);
        //状态要用1
        user.setBitState(1L);
        return user;
    }
}
